﻿using System;
using System.Data;
using System.Windows;
using System.Collections.Generic;
using InnvoiceActual.BaseDeDatos.innvoicedbDataSetTableAdapters;
using InnvoiceActual.Logica.GestorObject;
using MySql.Data.MySqlClient;


namespace InnvoiceActual.Logica.GestorDB
{
    public class ClienteDB
    {

        //private static UnicodigoArticuloDB _instance;
        //List<ClienteCS> _lista = new List<ClienteCS();

        //        //constructor
        //public ClienteDB()
        //{
        //    //setea la lista con los codigos al instanciarla.
        //    CargarClientes();
        //}

        //Da de alta un nuevo cliente
        public void DarDeAltaCliente(ClienteCS miCliente)
        {
            int iResult;
            clienteTableAdapter tablaCliente = new clienteTableAdapter();
            DataTable miTablaCliente = new DataTable();
            EmpresaCS auxEmpresa = EmpresaCS.Instance;

            tablaCliente.Connection.Open();
            MySqlTransaction mitransaccion = tablaCliente.Connection.BeginTransaction();

            try
            {

                iResult = tablaCliente.InsertQueryDarDeAltaCliente(auxEmpresa.CodigoEmpresa,
                                                                   miCliente.RazonSocial,
                                                                   miCliente.Telefono,
                                                                   miCliente.Correo,
                                                                   miCliente.Web,
                                                                   miCliente.Contacto,
                                                                   miCliente.Categoria,
                                                                   miCliente.Direccion,
                                                                   miCliente.NroLocalidad, miCliente.NroPais,                                                                   
                                                                   miCliente.CodigoPostal,
                                                                   miCliente.TipoDni,
                                                                   miCliente.NroDni,
                                                                   miCliente.NroTipoContrib,
                                                                   miCliente.Nrocontrib,
                                                                   miCliente.NroCondicionDePago,
                                                                   miCliente.ListaDePrecio,
                                                                   miCliente.LugarDeEntrega,
                                                                   miCliente.DiaHoraDePago, miCliente.NroProvincia,
                                                                   Convert.ToDateTime(miCliente.FechaAltaSistema),
                                                                   miCliente.Responsable
                                                                   );

                mitransaccion.Commit();

                if (iResult == 1)
                {
                    MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class::ClienteDb::DarDeAltaCliente:: Error:: " + e.Message, "Error",
                                MessageBoxButton.OK);
            }
            finally
            {
                mitransaccion.Connection.Close();
            }
        }

        //Actualiza los datos del cliente
        public void Actualizarcliente(ClienteCS miCliente)
        {
            int iResult;
            clienteTableAdapter tablaCliente = new clienteTableAdapter();
            DataTable miTablaCliente = new DataTable();
            EmpresaCS miEmpresa = EmpresaCS.Instance;

            tablaCliente.Connection.Open();
            MySqlTransaction mitransaccion = tablaCliente.Connection.BeginTransaction();


            try
            {
                
                iResult = tablaCliente.UpdateCliente(miCliente.RazonSocial,
                                                     miCliente.Telefono,
                                                     miCliente.Correo,
                                                     miCliente.Web,
                                                     miCliente.Contacto,
                                                     miCliente.Categoria,
                                                     miCliente.Direccion,
                                                     miCliente.NroLocalidad,
                                                     miCliente.NroPais,
                                                     miCliente.CodigoPostal,
                                                     miCliente.TipoDni,
                                                     miCliente.NroDni,
                                                     miCliente.NroTipoContrib,
                                                     miCliente.Nrocontrib,
                                                     miCliente.NroCondicionDePago,
                                                     miCliente.ListaDePrecio,
                                                     miCliente.Activo,
                                                     miCliente.LugarDeEntrega,
                                                     miCliente.DiaHoraDePago,
                                                     miCliente.NroProvincia,
                                                     miCliente.FechaAltaSistema,miCliente.Responsable,
                                                     miEmpresa.CodigoEmpresa,
                                                     miCliente.Codigo);
                mitransaccion.Commit();
                if (iResult == 1)
                {
                    MessageBox.Show("Operacion de Actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class::ClienteDb::Actualizarcliente:: Error:: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                mitransaccion.Connection.Close();
            }
        }

        //Trae todos los clientes para presentar en la razon social del facturar
        public List<ClienteCS> FacturarCliente()
        {

            List<ClienteCS> misClientes = new List<ClienteCS>();
            clienteTableAdapter dbCliente = new clienteTableAdapter();
            DataTable tablaCliente = new DataTable();

            dbCliente.Connection.Open();
            MySqlTransaction mitransaccion = dbCliente.Connection.BeginTransaction();

            try
            {
                tablaCliente = dbCliente.GetData();

                foreach (DataRow items in tablaCliente.Rows)
                {
                    ClienteCS dataCliente = new ClienteCS();
                    dataCliente.Codigo = Convert.ToInt16(items["codigo_cliente"].ToString());
                    dataCliente.RazonSocial = items["razon_social"].ToString();
                    dataCliente.Responsable = items["resp_legal"].ToString();
                    dataCliente.Telefono = items["telefono"].ToString();
                    dataCliente.Correo = items["correo"].ToString();
                    dataCliente.Web = items["web"].ToString();
                    dataCliente.Contacto = items["contacto"].ToString();
                    dataCliente.NroLocalidad = Convert.ToByte(items["localidad"].ToString());
                    dataCliente.NroProvincia = Convert.ToByte(items["provincia"].ToString());
                    dataCliente.NroPais = Convert.ToByte(items["pais"].ToString());
                    dataCliente.NroCondicionDePago = Convert.ToByte(items["condicion_pago"]);
                    //dataCliente.Localidad = items["Localidaddescrip"].ToString();
                    //dataCliente.Provincia = items["provinciadescrip"].ToString();
                    //dataCliente.Pais = items["paisdescrip"].ToString();
                    dataCliente.Direccion = items["direccion"].ToString();
                    dataCliente.TipoDni = Convert.ToByte(items["tipo_dni"].ToString());
                    dataCliente.CodigoPostal = items["codigopostal"].ToString();
                    dataCliente.NroTipoContrib = Convert.ToByte(items["tipo_contrib"].ToString());
                    //dataCliente.TipoContrib = items["contribuyentedescrip"].ToString();
                    dataCliente.Nrocontrib = items["nro_contrib"].ToString();
                    dataCliente.ListaDePrecio = items["lista_precio"].ToString();
                    dataCliente.Activo = Convert.ToByte(items["activo"]);
                    dataCliente.FechaAltaSistema = DateTime.SpecifyKind(Convert.ToDateTime(items["fechadealta"]), DateTimeKind.Local);
                    //Convert.ToDateTime(items["fechadealta"]).Date;
                    misClientes.Add(dataCliente);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs ClienteDB - metodo: filtrarClientes :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
                mitransaccion.Rollback();
            }
            finally
            {
                mitransaccion.Connection.Close();
            }

            return misClientes;
        }

        //Trae algunos clientes para presentar
        public List<ClienteCS> filtrarClientes() {

            List<ClienteCS> misClientes = new List<ClienteCS>();
            clienteTableAdapter dbCliente = new clienteTableAdapter();
            DataTable tablaCliente = new DataTable();
            
            dbCliente.Connection.Open();
            MySqlTransaction mitransaccion = dbCliente.Connection.BeginTransaction();

            try
            {
                tablaCliente = dbCliente.getDataObtenerClientes();

                foreach (DataRow items in tablaCliente.Rows)
                {
                    ClienteCS dataCliente = new ClienteCS();
                    dataCliente.Codigo = Convert.ToInt16(items["codigo_cliente"].ToString());
                    dataCliente.RazonSocial = items["razon_social"].ToString();
                    dataCliente.Responsable = items["resp_legal"].ToString();
                    dataCliente.Telefono = items["telefono"].ToString();
                    dataCliente.Correo = items["correo"].ToString();
                    dataCliente.Web = items["web"].ToString();
                    dataCliente.Contacto = items["contacto"].ToString();
                    dataCliente.NroLocalidad = Convert.ToByte(items["localidad"].ToString());
                    dataCliente.NroProvincia = Convert.ToByte(items["provincia"].ToString());
                    dataCliente.NroPais = Convert.ToByte(items["pais"].ToString());
                    dataCliente.NroCondicionDePago = Convert.ToByte(items["condicion_pago"]);
                    dataCliente.Localidad = items["Localidaddescrip"].ToString();
                    dataCliente.Provincia = items["provinciadescrip"].ToString();
                    dataCliente.Pais = items["paisdescrip"].ToString();
                    dataCliente.Direccion = items["direccion"].ToString();
                    dataCliente.TipoDni = Convert.ToByte(items["tipo_dni"].ToString());
                    dataCliente.CodigoPostal = items["codigopostal"].ToString();
                    dataCliente.NroTipoContrib = Convert.ToByte(items["tipo_contrib"].ToString());
                    dataCliente.TipoContrib = items["contribuyentedescrip"].ToString();
                    dataCliente.Nrocontrib = items["nro_contrib"].ToString();
                    dataCliente.ListaDePrecio = items["lista_precio"].ToString();
                    dataCliente.Activo = Convert.ToByte(items["activo"]);
                    dataCliente.FechaAltaSistema = DateTime.SpecifyKind(Convert.ToDateTime(items["fechadealta"]), DateTimeKind.Local);
                        //Convert.ToDateTime(items["fechadealta"]).Date;
                    misClientes.Add(dataCliente);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs ClienteDB - metodo: filtrarClientes :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
                mitransaccion.Rollback();
            }
            finally
            {
                mitransaccion.Connection.Close();
            }

            return misClientes;
        }

        //Trae algunos clientes para presentar
        public List<ClienteCS> filtrarClientesPorRS ( string auxRS)
        {

            List<ClienteCS> misClientes = new List<ClienteCS>();
            clienteTableAdapter dbCliente = new clienteTableAdapter();
            DataTable tablaCliente = new DataTable();

            dbCliente.Connection.Open();
            MySqlTransaction mitransaccion = dbCliente.Connection.BeginTransaction();

            try
            {
                tablaCliente = dbCliente.GetDataByFiltrarPorRasonSocial(auxRS);

                foreach (DataRow items in tablaCliente.Rows)
                {
                    ClienteCS dataCliente = new ClienteCS();
                    dataCliente.Codigo = Convert.ToInt16(items["codigo_cliente"].ToString());
                    dataCliente.RazonSocial = items["razon_social"].ToString();
                    dataCliente.Responsable = items["resp_legal"].ToString();
                    dataCliente.Telefono = items["telefono"].ToString();
                    dataCliente.Correo = items["correo"].ToString();
                    dataCliente.Web = items["web"].ToString();
                    dataCliente.Contacto = items["contacto"].ToString();
                    dataCliente.NroLocalidad = Convert.ToInt16(items["localidad"].ToString());
                    dataCliente.NroProvincia = Convert.ToInt16(items["provincia"].ToString());
                    dataCliente.NroPais = Convert.ToInt16(items["pais"].ToString());
                    dataCliente.NroCondicionDePago = Convert.ToInt16(items["condicion_pago"]);
                    //dataCliente.Localidad = items["Localidaddescrip"].ToString();
                    //dataCliente.Provincia = items["provinciadescrip"].ToString();
                    //dataCliente.Pais = items["paisdescrip"].ToString();
                    dataCliente.Direccion = items["direccion"].ToString();
                    dataCliente.TipoDni = Convert.ToByte(items["tipo_dni"].ToString());
                    dataCliente.CodigoPostal = items["codigopostal"].ToString();
                    dataCliente.NroTipoContrib = Convert.ToByte(items["tipo_contrib"].ToString());
                    //dataCliente.TipoContrib = items["contribuyentedescrip"].ToString();
                    dataCliente.Nrocontrib = items["nro_contrib"].ToString();
                    dataCliente.ListaDePrecio = items["lista_precio"].ToString();
                    dataCliente.Activo = Convert.ToByte(items["activo"]);
                    dataCliente.FechaAltaSistema = DateTime.SpecifyKind(Convert.ToDateTime(items["fechadealta"]), DateTimeKind.Local);
                    //---------------------------
                    misClientes.Add(dataCliente);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs ClienteDB - metodo: filtrarClientes :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
                mitransaccion.Rollback();
            }
            finally
            {
                mitransaccion.Connection.Close();
            }

            return misClientes;
        }

        //Trae algunos clientes para presentar
        public List<ClienteCS> filtrarClientesPorLocalidad(string auxRS)
        {

            List<ClienteCS> misClientes = new List<ClienteCS>();
            clienteTableAdapter dbCliente = new clienteTableAdapter();
            DataTable tablaCliente = new DataTable();

            dbCliente.Connection.Open();
            MySqlTransaction mitransaccion = dbCliente.Connection.BeginTransaction();

            try
            {
                tablaCliente = dbCliente.GetDataByFiltrarPorLocalidad(auxRS);                

                foreach (DataRow items in tablaCliente.Rows)
                {
                    ClienteCS dataCliente = new ClienteCS();
                    dataCliente.Codigo = Convert.ToInt16(items["codigo_cliente"].ToString());
                    dataCliente.RazonSocial = items["razon_social"].ToString();
                    dataCliente.Responsable = items["resp_legal"].ToString();
                    dataCliente.Telefono = items["telefono"].ToString();
                    dataCliente.Correo = items["correo"].ToString();
                    dataCliente.Web = items["web"].ToString();
                    dataCliente.Contacto = items["contacto"].ToString();
                    dataCliente.NroLocalidad = Convert.ToInt16(items["localidad"].ToString());
                    dataCliente.NroProvincia = Convert.ToInt16(items["provincia"].ToString());
                    dataCliente.NroPais = Convert.ToInt16(items["pais"].ToString());
                    dataCliente.NroCondicionDePago = Convert.ToInt16(items["condicion_pago"]);
                    //dataCliente.Localidad = items["Localidaddescrip"].ToString();
                    //dataCliente.Provincia = items["provinciadescrip"].ToString();
                    //dataCliente.Pais = items["paisdescrip"].ToString();
                    dataCliente.Direccion = items["direccion"].ToString();
                    dataCliente.TipoDni = Convert.ToByte(items["tipo_dni"].ToString());
                    dataCliente.CodigoPostal = items["codigopostal"].ToString();
                    dataCliente.NroTipoContrib = Convert.ToByte(items["tipo_contrib"].ToString());
                    //dataCliente.TipoContrib = items["contribuyentedescrip"].ToString();
                    dataCliente.Nrocontrib = items["nro_contrib"].ToString();
                    dataCliente.ListaDePrecio = items["lista_precio"].ToString();
                    dataCliente.Activo = Convert.ToByte(items["activo"]);
                    dataCliente.FechaAltaSistema = DateTime.SpecifyKind(Convert.ToDateTime(items["fechadealta"]), DateTimeKind.Local);

                    //---------------------------
                    misClientes.Add(dataCliente);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs ClienteDB - metodo: filtrarClientes :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
                mitransaccion.Rollback();
            }
            finally
            {
                mitransaccion.Connection.Close();
            }

            return misClientes;
        }

        //Trae algunos clientes para presentar
        public List<ClienteCS> filtrarClientesPorContacto(string auxRS)
        {

            List<ClienteCS> misClientes = new List<ClienteCS>();
            clienteTableAdapter dbCliente = new clienteTableAdapter();
            DataTable tablaCliente = new DataTable();

            dbCliente.Connection.Open();
            MySqlTransaction mitransaccion = dbCliente.Connection.BeginTransaction();

            try
            {
                tablaCliente = dbCliente.GetDataByFiltrarPorContacto(auxRS);

                foreach (DataRow items in tablaCliente.Rows)
                {
                    ClienteCS dataCliente = new ClienteCS();
                    dataCliente.Codigo = Convert.ToInt16(items["codigo_cliente"].ToString());
                    dataCliente.RazonSocial = items["razon_social"].ToString();
                    dataCliente.Responsable = items["resp_legal"].ToString();
                    dataCliente.Telefono = items["telefono"].ToString();
                    dataCliente.Correo = items["correo"].ToString();
                    dataCliente.Web = items["web"].ToString();
                    dataCliente.Contacto = items["contacto"].ToString();
                    dataCliente.NroLocalidad = Convert.ToInt16(items["localidad"].ToString());
                    dataCliente.NroProvincia = Convert.ToInt16(items["provincia"].ToString());
                    dataCliente.NroPais = Convert.ToInt16(items["pais"].ToString());
                    dataCliente.NroCondicionDePago = Convert.ToInt16(items["condicion_pago"]);
                    //dataCliente.Localidad = items["Localidaddescrip"].ToString();
                    //dataCliente.Provincia = items["provinciadescrip"].ToString();
                    //dataCliente.Pais = items["paisdescrip"].ToString();
                    dataCliente.Direccion = items["direccion"].ToString();
                    dataCliente.TipoDni = Convert.ToByte(items["tipo_dni"].ToString());
                    dataCliente.CodigoPostal = items["codigopostal"].ToString();
                    dataCliente.NroTipoContrib = Convert.ToByte(items["tipo_contrib"].ToString());
                    //dataCliente.TipoContrib = items["contribuyentedescrip"].ToString();
                    dataCliente.Nrocontrib = items["nro_contrib"].ToString();
                    dataCliente.ListaDePrecio = items["lista_precio"].ToString();
                    dataCliente.Activo = Convert.ToByte(items["activo"]);
                    dataCliente.FechaAltaSistema = DateTime.SpecifyKind(Convert.ToDateTime(items["fechadealta"]), DateTimeKind.Local);
                    //---------------------------
                    misClientes.Add(dataCliente);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs ClienteDB - metodo: filtrarClientes :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
                mitransaccion.Rollback();
            }
            finally
            {
                mitransaccion.Connection.Close();
            }

            return misClientes;
        }

        //Trae algunos clientes para presentar
        public List<ClienteCS> filtrarClientesPorProvincia(string auxRS)
        {

            List<ClienteCS> misClientes = new List<ClienteCS>();
            clienteTableAdapter dbCliente = new clienteTableAdapter();
            DataTable tablaCliente = new DataTable();

            dbCliente.Connection.Open();
            MySqlTransaction mitransaccion = dbCliente.Connection.BeginTransaction();

            try
            {
                tablaCliente = dbCliente.GetDataByFiltrarPorProvincia(auxRS);

                foreach (DataRow items in tablaCliente.Rows)
                {
                    ClienteCS dataCliente = new ClienteCS();
                    dataCliente.Codigo = Convert.ToInt16(items["codigo_cliente"].ToString());
                    dataCliente.RazonSocial = items["razon_social"].ToString();
                    dataCliente.Responsable = items["resp_legal"].ToString();
                    dataCliente.Telefono = items["telefono"].ToString();
                    dataCliente.Correo = items["correo"].ToString();
                    dataCliente.Web = items["web"].ToString();
                    dataCliente.Contacto = items["contacto"].ToString();
                    dataCliente.NroLocalidad = Convert.ToInt16(items["localidad"].ToString());
                    dataCliente.NroProvincia = Convert.ToInt16(items["provincia"].ToString());
                    dataCliente.NroPais = Convert.ToInt16(items["pais"].ToString());
                    dataCliente.NroCondicionDePago = Convert.ToInt16(items["condicion_pago"]);
                    //dataCliente.Localidad = items["Localidaddescrip"].ToString();
                    //dataCliente.Provincia = items["provinciadescrip"].ToString();
                    //dataCliente.Pais = items["paisdescrip"].ToString();
                    dataCliente.Direccion = items["direccion"].ToString();
                    dataCliente.TipoDni = Convert.ToByte(items["tipo_dni"].ToString());
                    dataCliente.CodigoPostal = items["codigopostal"].ToString();
                    dataCliente.NroTipoContrib = Convert.ToByte(items["tipo_contrib"].ToString());
                    //dataCliente.TipoContrib = items["contribuyentedescrip"].ToString();
                    dataCliente.Nrocontrib = items["nro_contrib"].ToString();
                    dataCliente.ListaDePrecio = items["lista_precio"].ToString();
                    dataCliente.Activo = Convert.ToByte(items["activo"]);
                    dataCliente.FechaAltaSistema = DateTime.SpecifyKind(Convert.ToDateTime(items["fechadealta"]), DateTimeKind.Local);
                    //---------------------------
                    misClientes.Add(dataCliente);
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs ClienteDB - metodo: filtrarClientes :: " + mException.Message, "Cuidado", MessageBoxButton.OK);
                mitransaccion.Rollback();
            }
            finally
            {
                mitransaccion.Connection.Close();
            }

            return misClientes;
        }

        public ClienteCS ObtenerClientePorCodigo(int codigo)
        {

            ClienteCS cliente = new ClienteCS();

            clienteTableAdapter clienteTB = new clienteTableAdapter();

            clienteTB.Connection.Open();
            MySqlTransaction transaccion = clienteTB.Connection.BeginTransaction();

            int codigoEmpresa = EmpresaCS.Instance.CodigoEmpresa;

            try
            {
                DataTable resultadoConsulta = clienteTB.GetDataByObtenerClientePorCodigo(codigoEmpresa, codigo);

                if (resultadoConsulta.Rows.Count > 0)
                {
                    foreach (DataRow item in resultadoConsulta.Rows)
                    {
                        cliente.CodigoEmpresa = Convert.ToInt16(item["codigo_empresa"].ToString());
                        cliente.Codigo = Convert.ToInt16(item["codigo_cliente"].ToString());
                        cliente.RazonSocial = item["razon_social"].ToString();
                        cliente.Telefono = item["telefono"].ToString();
                        cliente.Correo = item["correo"].ToString();
                        cliente.Web = item["web"].ToString();
                        cliente.Contacto = item["contacto"].ToString();
                        cliente.NroLocalidad = Convert.ToByte(item["localidad"].ToString());
                        cliente.NroProvincia = Convert.ToByte(item["provincia"].ToString());
                        cliente.NroPais = Convert.ToByte(item["pais"].ToString());
                        cliente.NroCondicionDePago = Convert.ToByte(item["condicion_pago"]);
                        //cliente.Localidad = item["Localidaddescrip"].ToString();
                        //cliente.Provincia = item["provinciadescrip"].ToString();
                        //cliente.Pais = item["paisdescrip"].ToString();
                        cliente.Direccion = item["direccion"].ToString();
                        cliente.tipodni = Convert.ToByte(item["tipo_dni"].ToString());
                        cliente.nroDni = item["nro_dni"].ToString();
                        cliente.CodigoPostal = item["codigopostal"].ToString();
                        cliente.nroTipoContrib = Convert.ToByte(item["tipo_contrib"].ToString());
                        //cliente.TipoContrib = item["contribuyentedescrip"].ToString();
                        cliente.nrocontrib = item["nro_contrib"].ToString();
                        cliente.listaDePrecio = item["lista_precio"].ToString();
                        cliente.Activo = Convert.ToByte(item["activo"]);
                        cliente.FechaAltaSistema = Convert.ToDateTime(item["fechadealta"].ToString());
                    }
                }
                else
                {
                    cliente.Codigo = -1;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + "Error -- Class ClienteDB -- Methods ObtenerClientePorCodigo(int codigo)", "Cuidado", MessageBoxButton.OK);
                transaccion.Rollback();
            }
            finally
            {
                clienteTB.Connection.Close();
            }

            return cliente;
        }
    }
}
